package org.example.projecttwo.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import org.example.projecttwo.entity.Comment;
import org.example.projecttwo.entity.dto.content.request.CommentQueryDTO;
import org.example.projecttwo.entity.dto.content.request.ContentWithCommentCountDTO;

import java.util.List;

/**
 * 评论服务接口
 * 继承MyBatis-Plus的IService接口，获得基础CRUD能力
 */
public interface ICommentService extends IService<Comment> {

    /**
     * 分页多条件查询评论列表
     * @param page 分页对象，包含当前页码和每页条数
     * @param queryDTO 查询条件DTO，包含内容类型、内容ID等筛选条件
     * @return 分页的评论列表
     */
    IPage<Comment> pageByQuery(Page<Comment> page, CommentQueryDTO queryDTO);

    /**
     * 删除评论及其所有子评论
     * @param commentId 评论ID
     * @return 总共删除的评论数量（包括当前评论和所有子评论）
     */
    int removeCommentAndChildren(Long commentId);

    /**
     * 批量删除评论及其所有子评论
     * @param commentIds 评论ID列表
     * @return 总共删除的评论数量（包括所有评论及其子评论）
     */
    int removeCommentsAndChildren(List<Long> commentIds);

    /**
     * 清空指定内容的所有评论（包括所有层级）
     * @param contentType 内容类型：1-文章，2-新闻
     * @param contentId 内容ID（文章ID或新闻ID）
     * @return 总共删除的评论数量
     */
    int clearByContentTypeAndId(Integer contentType, Long contentId);

    /**
     * 分页查询指定类型的内容列表及其评论数量
     * @param page 分页对象
     * @param contentType 内容类型：1-文章，2-新闻
     * @param keyword 内容标题搜索关键词（可选）
     * @return 包含评论数量的内容分页列表
     */
    IPage<ContentWithCommentCountDTO> pageContentWithCommentCount(
            Page<ContentWithCommentCountDTO> page,
            Integer contentType,
            String keyword);
    /**
     * 分页查询指定评论的所有回复
     * @param page 分页对象
     * @param parentId 父评论ID
     * @return 分页的回复评论列表
     */
    IPage<Comment> pageReplies(Page<Comment> page, Long parentId);

    /**
     * 检查评论是否存在
     * @param id 评论ID
     * @return 存在返回true，否则返回false
     */
    boolean existsById(Long id);
}